package com.cskaoyan.javase.oop2._1extends._2conversion;

/**
 * 引用数据类型的类型转换
 * 和基本数据类型的类型转换有相似的地方,都分为两种:
 *      1.自动类型转换:编译器自动完成.无需写额外代码
 *      2.强制类型转换:程序员手动,需要写代码
 *
 * Father fs = new Son();
 * Son对象本身应该用Son引用指向,这里是用Father引用,这其实就是一种引用数据类型的类型转换\
 * 这是一种自动类型转换,并且这里转换的是什么的类型呢?
 * 1.注意,引用数据类型的类型转换,转换的都是引用的数据类型,对象的数据类型是不可能转换的.
 *
 * 2.引用数据类型的类型转换的条件: 必须存在继承,继承中的父子关系的两个类才能发生引用数据类型的类型转换.
 * 继承的优点: 打破了引用数据类型的类型限制,使引用数据类型可以发生类型转换.
 *
 * 3.引用数据类型的自动类型转换:编译器自动完成.无需写额外代码
 *      条件: 把子类引用转换成父类引用,这个过程编译器自动完成
 *      为什么: 子类"is-a"父类
 *      当然引用数据类型的自动类型转换,这个说法太长了,从继承的方向来说,是从下往上的,是向上的
 *              所以引用数据类型的自动类型转换,也叫做"向上转型"
 *
 * 4.引用数据类型的强制类型转换:程序员手动,需要写代码
 *      条件: 把父类引用转换成子类引用,这个过程需要程序员写代码强制编译器做类型转换
 *      语法: 子类类名 对象名 = (子类类名)父类引用
 *      为什么: 因为父类不能看成子类,子类往往比父类强大
 *      当然引用数据类型的强制类型转换,这个方法也很长,从继承的方向来说,是从上往下的,是向下的
 *              所以引用数据类型的强制类型转换,也叫做"向下转型"
 *
 * 其中,向上转型很简单,自动完成
 * 但是向下转型,是把一个父类对象当成子类对象去使用,这在绝大情况下都是不可能的.所以引用数据类型的强制类型转换想要完成，条件会更加很苛刻。（这里先了解一下概念，后续章节继续学习！）
 *
 * @since 10:09
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Demo d = new Demo();
        // String s = d;
        Son s = new Son();
        Father f = s;
        Father fs = new Son();

        Son s2 = (Son) fs;
    }
}

class Father {
}

class Son extends Father {
}

class Son2 extends Father {
}
